/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package projetbi_parsing;

import java.util.List;
import java.util.ArrayList;

/**
 * Projet BI - M2 FIC 2012-2013
 *
 * @author Jef, Tuan-Long, William, Mohamed
 */
public class StringDecoupeur {

// Un "découpeur" de Strings. Derrière ce nom peu glamour
// se cache un outil permettant de découper une chaîne en
// tableau de Strings.
    private StringDecoupeur() {
        // Constructeur vide.
    }

    /**
     * Analyse la ligne de commande et la découpe en un tableau de String. Les
     * arguments qui contiennent des espaces doivent être écrits entre guillemet
     * Les guillemets doivent être échapés en utilisant le char '\' Les
     * caractère '\' doivent être échapés en utilisant '\\'
     *
     * @param commandLine La ligne de commande à découper
     * @return une liste d'argument résultant de la ligne de commande.
     */
    public static List<String> decoupeCmdLine(String commandLine) {
        List<String> resultBuffer = new ArrayList<String>();

        if (commandLine != null) {
            int z = commandLine.length();
            boolean insideQuotes = false;
            StringBuffer buf = new StringBuffer();

            for (int i = 0; i < z; ++i) {
                char c = commandLine.charAt(i);
                if (c == '"') {
                    appendToBuffer(resultBuffer, buf);
                    insideQuotes = !insideQuotes;
                } else if (c == '\\') {
                    if ((z > i + 1)
                            && ((commandLine.charAt(i + 1) == '"')
                            || (commandLine.charAt(i + 1) == '\\'))) {
                        buf.append(commandLine.charAt(i + 1));
                        ++i;
                    } else {
                        buf.append("\\");
                    }
                } else {
                    if (insideQuotes) {
                        buf.append(c);
                    } else {
                        if (Character.isWhitespace(c)) {
                            appendToBuffer(resultBuffer, buf);
                        } else {
                            buf.append(c);
                        }
                    }
                }
            }
            appendToBuffer(resultBuffer, buf);

        }
        return resultBuffer;
    }

    private static void appendToBuffer(List<String> resultBuffer,
            StringBuffer buf) {
        if (buf.length() > 0) {
            resultBuffer.add(buf.toString());
            buf.setLength(0);
        }
    }

    // Transforme un ArrayList<String> en String
    public String ALS2String(ArrayList<String> arr) {
        String res = new String();
        StringBuilder sb = new StringBuilder();
        
        for (String s : arr) {
            sb.append(s);
            sb.append(" ");
        }
        
        return res;
    }
}
